From 29a21651fe97a812deae16f8797caacc8c0b3e47 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 9 Aug 2016 15:14:26 +0300 Subject: [PATCH] Gracefully handle duplicate package in a lockfile --- src/cargo/core/resolver/encode.rs | 13 +++++---- src/cargo/ops/lockfile.rs | 2 +- tests/bad-config.rs | 44 +++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 8771a9532..ca4cdec2e 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -20,7 +20,7 @@ pub struct EncodableResolve { pub type Metadata = BTreeMap; impl EncodableResolve { - pub fn to_resolve(self, ws: &Workspace) -> CargoResult { + pub fn into_resolve(self, ws: &Workspace) -> CargoResult { let path_deps = build_path_deps(ws); let default = try!(ws.current()).package_id().source_id(); @@ -48,14 +48,17 @@ impl EncodableResolve { let mut register_pkg = |pkgid: &PackageId| { let precise = pkgid.source_id().precise() .map(|s| s.to_string()); - assert!(tmp.insert(pkgid.clone(), precise).is_none(), - "a package was referenced twice in the lockfile"); + if tmp.insert(pkgid.clone(), precise).is_some() { + return Err(internal(format!("package `{}` is specified twice in the lockfile", + pkgid.name()))); + } g.add(pkgid.clone(), &[]); + Ok(()) }; - register_pkg(&root); + try!(register_pkg(&root)); for id in ids.iter() { - register_pkg(id); + try!(register_pkg(id)); } } diff --git a/src/cargo/ops/lockfile.rs b/src/cargo/ops/lockfile.rs index 91a2bf2d7..2afb4d534 100644 --- a/src/cargo/ops/lockfile.rs +++ b/src/cargo/ops/lockfile.rs @@ -26,7 +26,7 @@ pub fn load_pkg_lockfile(ws: &Workspace) -> CargoResult> { let table = toml::Value::Table(table); let mut d = toml::Decoder::new(table); let v: resolver::EncodableResolve = try!(Decodable::decode(&mut d)); - Ok(Some(try!(v.to_resolve(ws)))) + Ok(Some(try!(v.into_resolve(ws)))) }).chain_error(|| { human(format!("failed to parse lock file at: {}", f.path().display())) }) diff --git a/tests/bad-config.rs b/tests/bad-config.rs index 15324711f..ef1912d47 100644 --- a/tests/bad-config.rs +++ b/tests/bad-config.rs @@ -236,6 +236,50 @@ Caused by: ")); } +#[test] +fn duplicate_packages_in_cargo_lock() { + Package::new("foo", "0.1.0").publish(); + + let p = project("bar") + .file("Cargo.toml", r#" + [project] + name = "bar" + version = "0.0.1" + authors = [] + + [dependencies] + foo = "0.1.0" + "#) + .file("src/lib.rs", "") + .file("Cargo.lock", r#" + [root] + name = "bar" + version = "0.0.1" + dependencies = [ + "foo 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + ] + + [[package]] + name = "foo" + version = "0.1.0" + source = "registry+https://github.com/rust-lang/crates.io-index" + + [[package]] + name = "foo" + version = "0.1.0" + source = "registry+https://github.com/rust-lang/crates.io-index" + "#); + p.build(); + + assert_that(p.cargo("build").arg("--verbose"), + execs().with_status(101).with_stderr("\ +[ERROR] failed to parse lock file at: [..] + +Caused by: + package `foo` is specified twice in the lockfile +")); +} + #[test] fn bad_git_dependency() { let foo = project("foo") -- 2.30.2